#include "usermodel.hpp"
#include "db/db.h"
#include <iostream>
#include "muduo/base/Logging.h"
#include "mysql_conn_pool.hpp"

//*可改进地方，可以看出函数中每次调用每次都建立一个MySQL连接，这里可以像WebServer一样用数据库连接池

bool UserModel::insert(User& user){
    //组装sql语句所用到的临时空间
    char sql[512]={0};
    //sprintf --- 把字符串输出（写入）char数组中
    sprintf(sql,"insert into `user`(name,password,state,salt) values('%s','%s','%s','%s')",
        user.getName().c_str(),user.getPwd().c_str(),user.getState().c_str(),user.getSalt().c_str());

    //从数据库连接池中获取连接对象，并且使用RAII机制
    MySQL* mysql = nullptr;
    mysql_connpool_RAII RAII(&mysql,mysql_connPool::getInstance());

    if(mysql!=nullptr){
        if(mysql->update(sql)){
            //mysql_insert_id(MYSQL*)获得刚刚插入语句所生成的主键id
            //这里再把该id回给user对象，修改其值
            user.setID(mysql_insert_id(mysql->getConnection()));
            return true;
        }
    }
    return false;
}

//根据用户id查询用户信息
User UserModel::query(int id){
    char sql[512];
    sprintf(sql,"select * from `user` where id = %d",id);

    //从数据库连接池中获取连接对象，并且使用RAII机制
    MySQL* mysql = nullptr;
    mysql_connpool_RAII RAII(&mysql,mysql_connPool::getInstance());

    if(mysql!=nullptr){
        MYSQL_RES* res=mysql->query(sql);
        if(res!=nullptr){
            MYSQL_ROW row = mysql_fetch_row(res);
            if(row!=nullptr){
                //查询到数据行

                User user;
                user.setID(atoi(row[0]));
                user.setName(row[1]);
                user.setPwd(row[2]);
                user.setSalt(row[3]);
                user.setState(row[4]);
                
                
                mysql_free_result(res);
                return user;
            }
        }
        mysql_free_result(res);
    }

    return User();

}

//更新用户user对象的信息
bool UserModel::updateState(User& user){
    char sql[512];
    sprintf(sql,"update `user` set state = '%s' where id = %d",user.getState().c_str(),user.getId());

    //从数据库连接池中获取连接对象，并且使用RAII机制
    MySQL* mysql = nullptr;
    mysql_connpool_RAII RAII(&mysql,mysql_connPool::getInstance());

    if(mysql!=nullptr){
        if(mysql->update(sql)){
            return true;
        }
    }

    return false;
}


//重置用户状态方法
void UserModel::resetState(){
    char sql[128]={0};
    sprintf(sql,"update user set state = 'offline' where state = 'online'");

    //从数据库连接池中获取连接对象，并且使用RAII机制
    MySQL* mysql = nullptr;
    mysql_connpool_RAII RAII(&mysql,mysql_connPool::getInstance());

    if(mysql!=nullptr){
        if(!mysql->update(sql)){
            LOG_INFO<<"reset user state failed!";
        }
    }
}